#include <stdio.h>
#include "ordenamiento_de_partidas.h"

t_ronda* ordenar_liga(int cant_jugadores){
	int i, j, k, l, m, player_1, player_2, cant_rondas,cant_partidas_ronda;

	cant_rondas = cantidad_rondas(cant_jugadores);
	cant_partidas_ronda = cant_partidas_por_ronda(cant_jugadores);

	t_jugador *jugadores = (t_jugador *) malloc(sizeof(t_jugador)*cant_jugadores);
	if(jugadores == NULL){
		fprintf(stderr, "Error al pedir memoria ordenamiento_de_partidas\n");
		exit(1);
	}

	t_ronda *ronda = (t_ronda *) malloc(sizeof(t_ronda)*cant_rondas);
	if(ronda == NULL){
		fprintf(stderr, "Error al pedir memoria ordenamiento_de_partidas\n");
		exit(1);
	}

	for(i = 0; i < cant_rondas; i++)
		if((ronda[i].partida = (t_partida *) malloc(sizeof(t_partida)*cant_partidas_ronda)) == NULL){
			fprintf(stderr, "Error al pedir memoria ordenamiento_de_partidas\n");
			exit(1);
		}

	for(i = 0; i < cant_jugadores ; i++)
		jugadores[i].id_llegada = i;
	
	k=cant_jugadores-1;
	j=0;

	for(i = 0; i < cant_jugadores ; i++){
		if(i%2 == 0){
			jugadores[i].id_ordenamiento = j;
			j++;
		}else{
			jugadores[i].id_ordenamiento = k;
			k--;
		}
	}

	for(i = 0; i < cant_rondas ; i++){
		k = cant_jugadores;
		for(j = 0; j < cant_partidas_por_ronda(cant_jugadores) ; j++){
			if(j == 0){
				l = 0;
				while(jugadores[l].id_ordenamiento != cant_jugadores-1-i)
					l++;

				ronda[i].partida[j].player_1 = jugadores[0].id_llegada;
				ronda[i].partida[j].player_2 = jugadores[l].id_llegada;
			}else{
				player_1 = (i+k)%cant_jugadores;
				if(player_1 > (k-1))
					player_1--;
	
				player_2 = (i+j+1)%cant_jugadores;
				if(player_2 > j)
					player_2--;

				l = 0;
				while(jugadores[l].id_ordenamiento != cant_jugadores-1-player_1)
					l++;

				m = 0;
				while(jugadores[m].id_ordenamiento != cant_jugadores-1-player_2)
					m++;

				ronda[i].partida[j].player_1 = jugadores[l].id_llegada;
				ronda[i].partida[j].player_2 = jugadores[m].id_llegada;
			}
			k--;
		}
	}
	return ronda;
}

int cantidad_rondas(int jugadores){
	return jugadores-1;
}

int cant_partidas_por_ronda(int jugadores){
	return jugadores/2;
}